home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Sound / AHI / Developer / examples / Low-level / PT-AHIPlay / PT-AHIPlay_old.s next >
Text File  |  1997-04-16  |  29KB  |  1,524 lines

  1. ;Run me to assemble with PhxAsm
  2.     IF    0
  3. PhxAss SYMDEBUG LINEDEBUG QUIET OPT NRQBPSMD PT-AHIPlay.s
  4. Quit
  5.     ENDC
  6.  
  7. ;**************************************************
  8. ;*    ----- Protracker V2.3A Playroutine -----    *
  9. ;**************************************************
  10.  
  11. ; Quick (&D?) adaption for 'ahi.device' by Martin Blom.
  12. ; SampleOffset, FilterOnOff and Funk commands not supported.
  13. ; Change MixFreq on line 209, AudioID on line 212 and module name at the end.
  14. ; SampleOffset can easily be supported (change ahi_sample).
  15. ; FilterOnOff cannot be be supported.
  16. ; Funk can be supported by using AHI_DYNAMICSAMPLE, but shouldn't.
  17.  
  18.     incdir    include:
  19.     include    lvo/exec_lib.i
  20.     include    lvo/dos_lib.i
  21.  
  22. main
  23.     bsr    ahi_init
  24.     tst.l    d0
  25.     bne.w    theend2
  26.     BSR    mt_init
  27.     tst.l    d0
  28.     bne.w    theend2
  29.     ST    mt_Enable
  30.  
  31.     move.l    ahibase(pc),a6
  32.     lea    echostruct(pc),a0
  33.     move.l    ahi_ctrl(pc),a2
  34.     jsr    _LVOAHI_SetEffect(a6)
  35.  
  36.     MOVE.L    4.W,A6
  37.     LEA    DOSname(PC),A1
  38.     MOVEQ    #0,D0
  39.     JSR    _LVOOpenLibrary(A6)
  40.     TST.L    D0
  41.     BEQ.S    theend
  42.     MOVE.L    D0,A6
  43. wloop    MOVEQ    #10,D1
  44.     JSR    _LVODelay(A6)
  45.     BTST    #6,$BFE001
  46.     BNE.S    wloop
  47.     BTST    #2,$DFF016
  48.     BNE.S    wloop
  49.     MOVE.L    A6,A1
  50.     MOVE.L    4.W,A6
  51.     JSR    _LVOCloseLibrary(A6)
  52. theend    BSR    mt_end
  53. theend2    bsr    ahi_end
  54.     RTS
  55.  
  56. echostruct
  57.     dc.l    AHIET_DSPECHO            ; ahie_Effect
  58.     dc.l    10000                ; ahiede_Delay
  59.     dc.l    $8000                ; ahiede_Feedback
  60.     dc.l    $8000                ; ahiede_Mix
  61.     dc.l    $0000                ; ahiede_Cross
  62.  
  63. DOSname    dc.b "dos.library",0
  64.  
  65. ;---- AHI stuff ----
  66.  
  67.     incdir    include:
  68.     include    devices/ahi.i
  69.     include    lvo/ahi_lib.i
  70.  
  71. ahi_init:
  72.     OPENAHI    1
  73.     move.l    d0,ahibase
  74.     beq.b    ahi_error
  75.     move.l    d0,a6
  76.     lea    ahi_tags(pc),a1
  77.     jsr    _LVOAHI_AllocAudioA(a6)
  78.     move.l    d0,ahi_ctrl
  79.     beq.w    ahi_error
  80.     move.l    d0,a2
  81.     moveq    #0,d0                ;Load module as one sound!
  82.     moveq    #AHIST_SAMPLE,d1
  83.     lea    ahi_sound0(pc),a0
  84.     jsr    _LVOAHI_LoadSound(a6)
  85.     tst.l    d0
  86.     bne.b    ahi_error
  87.     lea    ahi_ctrltags(pc),a1
  88.     jsr    _LVOAHI_ControlAudioA(a6)
  89.     tst.l    d0
  90.     bne.b    ahi_error
  91.     moveq    #0,d0
  92.     rts
  93. ahi_error:
  94.     moveq    #-1,d0
  95.     rts
  96. ahi_sound0:
  97.     dc.l    AHIST_M8S
  98.     dc.l    mt_data
  99.     dc.l    mt_data_len
  100. ahi_end:
  101.     move.l    ahibase(pc),d0
  102.     beq.b    .1
  103.     move.l    d0,a6
  104.     move.l    ahi_ctrl(pc),a2
  105.     jsr    _LVOAHI_FreeAudio(a6)
  106.     CLOSEAHI
  107. .1
  108.     rts
  109.  
  110. ;in:
  111. * d0    volume
  112. * a5    Channel ($dff0a0, $dff0b0, $dff0c0, or $dff0d0)
  113. ahi_volume:
  114.     movem.l    d0-d3/a0-a2/a6,-(sp)
  115.     move.l    ahibase(pc),a6
  116.  
  117.     and.l    #$ffff,d0
  118.  
  119.     lsl.l    #8,d0
  120.     lsl.l    #2,d0
  121.     move.l    d0,d1
  122.  
  123.     moveq    #1,d0
  124.     move.l    #$c000,d2        ;half-stereo if mode supports pan
  125.     cmp.l    #$dff0a0,a5
  126.     beq.b    .1
  127.     moveq    #0,d0
  128.     move.l    #$4000,d2        ;half-stereo if mode supports pan
  129.     cmp.l    #$dff0b0,a5
  130.     beq.b    .1
  131.     moveq    #2,d0
  132.     move.l    #$4000,d2        ;half-stereo if mode supports pan
  133.     cmp.l    #$dff0c0,a5
  134.     beq.b    .1
  135.     moveq    #3,d0
  136.     move.l    #$c000,d2        ;half-stereo if mode supports pan
  137. .1
  138.     moveq    #AHISF_IMM,d3
  139.     move.l    ahi_ctrl(pc),a2
  140.     jsr    _LVOAHI_SetVol(a6)
  141.     movem.l    (sp)+,d0-d3/a0-a2/a6
  142.     rts
  143.  
  144. ;in:
  145. * d0    period
  146. * a5    Channel ($dff0a0, $dff0b0, $dff0c0, or $dff0d0)
  147. ahi_period:
  148.     movem.l    d0-d2/a0-a2/a6,-(sp)
  149.     move.l    ahibase(pc),a6
  150.  
  151.     and.l    #$ffff,d0
  152.     beq.b    .exit
  153.  
  154.     move.l    #3546895,d1
  155.     divu.w    d0,d1
  156.     and.l    #$ffff,d1
  157.     
  158.     moveq    #1,d0
  159.     cmp.l    #$dff0a0,a5
  160.     beq.b    .1
  161.     moveq    #0,d0
  162.     cmp.l    #$dff0b0,a5
  163.     beq.b    .1
  164.     moveq    #2,d0
  165.     cmp.l    #$dff0c0,a5
  166.     beq.b    .1
  167.     moveq    #3,d0
  168. .1
  169.     moveq    #AHISF_IMM,d2
  170.     move.l    ahi_ctrl(pc),a2
  171.     jsr    _LVOAHI_SetFreq(a6)
  172. .exit
  173.     movem.l    (sp)+,d0-d2/a0-a2/a6
  174.     rts
  175.  
  176. ;in:
  177. * d0    instrument
  178. * a5    Channel ($dff0a0, $dff0b0, $dff0c0, or $dff0d0)
  179. ahi_sample:
  180.     movem.l    d0-d2/a0-a2/a6,-(sp)
  181.     move.l    ahibase(pc),a6
  182.  
  183.     and.l    #$ffff,d0
  184.     beq.b    .exit
  185.     move.l    d0,d1
  186.  
  187.     moveq    #1<<2,d0
  188.     cmp.l    #$dff0a0,a5
  189.     beq.b    .1
  190.     moveq    #0<<2,d0
  191.     cmp.l    #$dff0b0,a5
  192.     beq.b    .1
  193.     moveq    #2<<2,d0
  194.     cmp.l    #$dff0c0,a5
  195.     beq.b    .1
  196.     moveq    #3<<2,d0
  197. .1
  198.     lea    ahi_channels(pc),a0
  199.     move.l    d1,(a0,d0.l)            ;store instr for each channel
  200.     lsr.l    #2,d0
  201.  
  202.     lsl.l    #4,d1
  203.     lea    ahi_samples(pc),a0
  204.     move.l    0(a0,d1.l),d2            ;start
  205.     move.l    4(a0,d1.l),d3            ;length
  206.     moveq    #0,d1                ;sample bank
  207.     moveq    #AHISF_IMM,d4
  208.  
  209.     tst.l    d3
  210.     bne.b    .length_ok            ;length=0 means "no sound"
  211.     moveq    #AHI_NOSOUND,d1
  212. .length_ok
  213.     move.l    ahi_ctrl(pc),a2
  214.     jsr    _LVOAHI_SetSound(a6)
  215. .exit    movem.l    (sp)+,d0-d2/a0-a2/a6
  216.     rts
  217.  
  218. ahibase:    dc.l    0
  219. ahi_ctrl:    dc.l    0
  220. ahi_ctrltags:
  221.     dc.l    AHIC_Play,1
  222.     dc.l    TAG_DONE
  223. ahi_tags
  224.     dc.l    AHIA_MixFreq,22050
  225.     dc.l    AHIA_Channels,4
  226.     dc.l    AHIA_Sounds,1
  227.     dc.l    AHIA_AudioID,$00020004        ; Just an example! No hardcoded values permitted!
  228.     dc.l    AHIA_SoundFunc,SoundFunc
  229.     dc.l    AHIA_PlayerFunc,PlayerFunc
  230.     dc.l    AHIA_PlayerFreq,50<<16
  231.     dc.l    AHIA_MinPlayerFreq,(32*2/5)<<16
  232.     dc.l    AHIA_MaxPlayerFreq,(255*2/5)<<16
  233.     dc.l    TAG_DONE
  234.  
  235. ahi_samples    blk.b    (4*4)*32,0
  236. ahi_channels    blk.l    4,0
  237.     even
  238.  
  239. ;---- Tempo ----
  240.  
  241. SetTempo
  242.     movem.l    d0-d1/a0-a2/a6,-(sp)
  243.     CMP.W    #32,D0
  244.     BHS.S    setemsk
  245.     MOVEQ    #32,D0
  246. setemsk    MOVE.W    D0,RealTempo
  247.     and.l    #$ffff,d0
  248.     lsl.l    #1,d0
  249.     divu    #5,d0
  250.     swap.w    d0
  251.     clr.w    d0
  252.     move.l    d0,.freq
  253.  
  254.     move.l    ahibase(pc),a6
  255.     lea    .tags(pc),a1
  256.     move.l    ahi_ctrl(pc),a2
  257.     jsr    _LVOAHI_ControlAudioA(a6)
  258.     movem.l    (sp)+,d0-d1/a0-a2/a6
  259.     RTS
  260.  
  261. .tags
  262.     dc.l    AHIA_PlayerFreq
  263. .freq    dc.l    50<<16
  264.     dc.l    TAG_DONE
  265.  
  266. RealTempo    dc.w 125
  267.  
  268. PlayerFunc:
  269.     blk.b    MLN_SIZE
  270.     dc.l    mt_music
  271.     dc.l    0
  272.     dc.l    0
  273.  
  274. SoundFunc:
  275.     blk.b    MLN_SIZE
  276.     dc.l    soundfunc
  277.     dc.l    0
  278.     dc.l    0
  279.  
  280. ;in:
  281. * a0    struct Hook *
  282. * a1    struct AHISoundMessage *
  283. * a2    struct AHIAudioCtrl *
  284. soundfunc:
  285.     movem.l    d2-d4/a6,-(sp)
  286.     moveq    #0,d0
  287.     move.w    ahism_Channel(a1),d0
  288.     lea    ahi_channels(pc),a0
  289.     lsl.l    #2,d0
  290.     move.l    (a0,d0.l),d1
  291.     lsr.l    #2,d0
  292.     lsl.l    #4,d1
  293.     lea    ahi_samples(pc),a0
  294.     move.l    8(a0,d1.l),d2            ;repeat start
  295.     move.l    12(a0,d1.l),d3            ;repeat length
  296.     moveq    #0,d1                ;sample bank
  297.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  298.  
  299.     tst.l    d3
  300.     bne.b    .length_ok            ;length=0 means "no sound"
  301.     moveq    #AHI_NOSOUND,d1
  302. .length_ok
  303.     move.l    ahibase(pc),a6
  304.     jsr    _LVOAHI_SetSound(a6)
  305.     movem.l    (sp)+,d2-d4/a6
  306.     rts
  307.  
  308.  
  309. ;---- Playroutine ----
  310.  
  311. n_note        EQU    0  ; W
  312. n_cmd        EQU    2  ; W
  313. n_cmdlo        EQU    3  ; B
  314. n_start        EQU    4  ; L
  315. n_length    EQU    8  ; W
  316. n_loopstart    EQU    10 ; L
  317. n_replen    EQU    14 ; W
  318. n_period    EQU    16 ; W
  319. n_finetune    EQU    18 ; B
  320. n_volume    EQU    19 ; B
  321. n_dmabit    EQU    20 ; W
  322. n_toneportdirec    EQU    22 ; B
  323. n_toneportspeed    EQU    23 ; B
  324. n_wantedperiod    EQU    24 ; W
  325. n_vibratocmd    EQU    26 ; B
  326. n_vibratopos    EQU    27 ; B
  327. n_tremolocmd    EQU    28 ; B
  328. n_tremolopos    EQU    29 ; B
  329. n_wavecontrol    EQU    30 ; B
  330. n_glissfunk    EQU    31 ; B
  331. n_sampleoffset    EQU    32 ; B
  332. n_pattpos    EQU    33 ; B
  333. n_loopcount    EQU    34 ; B
  334. n_funkoffset    EQU    35 ; B
  335. n_wavestart    EQU    36 ; L
  336. n_reallength    EQU    40 ; W
  337.  
  338. n_sample    EQU    42 ; W     (new for ahi)
  339.  
  340. mt_init
  341.     LEA    mt_data,A0
  342.     MOVE.L    A0,mt_SongDataPtr
  343.     MOVE.L    A0,A1
  344.     LEA    952(A1),A1
  345.     MOVEQ    #127,D0
  346.     MOVEQ    #0,D1
  347. mtloop    MOVE.L    D1,D2
  348.     SUBQ.W    #1,D0
  349. mtloop2    MOVE.B    (A1)+,D1
  350.     CMP.B    D2,D1
  351.     BGT.S    mtloop
  352.     DBRA    D0,mtloop2
  353.     ADDQ.B    #1,D2
  354.  
  355. ;    LEA    mt_SampleStarts(PC),A1
  356. ;    ASL.L    #8,D2
  357. ;    ASL.L    #2,D2
  358. ;    ADD.L    #1084,D2
  359. ;    ADD.L    A0,D2
  360. ;    MOVE.L    D2,A2
  361. ;    MOVEQ    #30,D0
  362. ;mtloop3    CLR.L    (A2)
  363. ;    MOVE.L    A2,(A1)+
  364. ;    MOVEQ    #0,D1
  365. ;    MOVE.W    42(A0),D1
  366. ;    ASL.L    #1,D1
  367. ;    ADD.L    D1,A2
  368. ;    ADD.L    #30,A0
  369. ;    DBRA    D0,mtloop3
  370.  
  371.     lea    ahi_samples+(4*4)(pc),a1    ;Only 1-31 used.
  372.     asl.l    #8,d2
  373.     asl.l    #2,d2
  374.     add.l    #1084,d2
  375.     moveq    #31-1,d0
  376. mtloop3
  377.     tst.w    42(a0)                ;length in words
  378.     bne.b    .is_sample            ;empty sample slot
  379.     clr.l    (a1)+
  380.     clr.l    (a1)+
  381.     clr.l    (a1)+                ;zero length=no sound
  382.     clr.l    (a1)+
  383.     bra.b    .nextsample
  384.  
  385. .is_sample
  386.     move.l    d2,d3
  387.     move.l    d2,(a1)+            ;store one-shot start
  388.     moveq    #0,d1
  389.     move.w    42(a0),d1            ;length in words
  390.     lsl.l    #1,d1
  391.     add.l    d1,d2
  392.     tst.w    46(a0)                ;repeat start =0
  393.     beq.b    .playallfirst            ;isn't this a bug in PT?
  394.     moveq    #0,d1
  395.     move.w    46(a0),d1            ;repeat offset in words
  396.     add.w    48(a0),d1            ;repeat length in words
  397.     lsl.l    #1,d1
  398. .playallfirst
  399.     move.l    d1,(a1)+            ;store one-shot length
  400.  
  401.     cmp.w    #1,48(a0)            ;One-shot?
  402.     beq.b    .oneshot
  403.  
  404.     moveq    #0,d1
  405.     move.w    46(a0),d1            ;repeat offset in words
  406.     lsl.l    #1,d1
  407.     add.l    d3,d1                ;add sample start
  408.     move.l    d1,(a1)+            ;store repeat start
  409.     moveq    #0,d1
  410.     move.w    48(a0),d1            ;repeat length in words
  411.     lsl.l    #1,d1
  412.     move.l    d1,(a1)+            ;store repeat length
  413.     bra.b    .nextsample
  414. .oneshot
  415.     clr.l    (a1)+                ;store repeat start
  416.     clr.l    (a1)+                ;store repeat length
  417. .nextsample
  418.     add.l    #30,a0
  419.     dbf    d0,mtloop3
  420.  
  421. ;    OR.B    #2,$BFE001
  422.     MOVE.B    #6,mt_speed
  423.     CLR.B    mt_counter
  424.     CLR.B    mt_SongPos
  425.     CLR.W    mt_PatternPos
  426. mt_end    SF    mt_Enable
  427. ;    LEA    $DFF000,A0
  428. ;    CLR.W    $A8(A0)
  429. ;    CLR.W    $B8(A0)
  430. ;    CLR.W    $C8(A0)
  431. ;    CLR.W    $D8(A0)
  432. ;    MOVE.W    #$F,$DFF096
  433.  
  434.     moveq    #0,d0
  435.     lea     $dff0a0,A5
  436.     bsr    ahi_volume
  437.     lea     $dff0b0,A5
  438.     bsr    ahi_volume
  439.     lea     $dff0c0,A5
  440.     bsr    ahi_volume
  441.     lea     $dff0d0,A5
  442.     bsr    ahi_volume
  443.     moveq    #0,d0
  444.     RTS
  445. ahi_mt_error
  446.     moveq    #-1,d0
  447.     rts
  448.  
  449. mt_music
  450.     MOVEM.L    D0-D4/A0-A6,-(SP)
  451.     TST.B    mt_Enable
  452.     BEQ    mt_exit
  453.     ADDQ.B    #1,mt_counter
  454.     MOVE.B    mt_counter(PC),D0
  455.     CMP.B    mt_speed(PC),D0
  456.     BLO.S    mt_NoNewNote
  457.     CLR.B    mt_counter
  458.     TST.B    mt_PattDelTime2
  459.     BEQ.S    mt_GetNewNote
  460.     BSR.S    mt_NoNewAllChannels
  461.     BRA    mt_dskip
  462.  
  463. mt_NoNewNote
  464.     BSR.S    mt_NoNewAllChannels
  465.     BRA    mt_NoNewPosYet
  466.  
  467. mt_NoNewAllChannels
  468.     LEA    $DFF0A0,A5
  469.     LEA    mt_chan1temp(PC),A6
  470.     BSR    mt_CheckEfx
  471.     LEA    $DFF0B0,A5
  472.     LEA    mt_chan2temp(PC),A6
  473.     BSR    mt_CheckEfx
  474.     LEA    $DFF0C0,A5
  475.     LEA    mt_chan3temp(PC),A6
  476.     BSR    mt_CheckEfx
  477.     LEA    $DFF0D0,A5
  478.     LEA    mt_chan4temp(PC),A6
  479.     BRA    mt_CheckEfx
  480.  
  481. mt_GetNewNote
  482.     MOVE.L    mt_SongDataPtr(PC),A0
  483.     LEA    12(A0),A3
  484.     LEA    952(A0),A2    ;pattpo
  485.     LEA    1084(A0),A0    ;patterndata
  486.     MOVEQ    #0,D0
  487.     MOVEQ    #0,D1
  488.     MOVE.B    mt_SongPos(PC),D0
  489.     MOVE.B    (A2,D0.W),D1
  490.     ASL.L    #8,D1
  491.     ASL.L    #2,D1
  492.     ADD.W    mt_PatternPos(PC),D1
  493.     CLR.W    mt_DMACONtemp
  494.  
  495.     LEA    $DFF0A0,A5
  496.     LEA    mt_chan1temp(PC),A6
  497.     BSR.S    mt_PlayVoice
  498.     LEA    $DFF0B0,A5
  499.     LEA    mt_chan2temp(PC),A6
  500.     BSR.S    mt_PlayVoice
  501.     LEA    $DFF0C0,A5
  502.     LEA    mt_chan3temp(PC),A6
  503.     BSR.S    mt_PlayVoice
  504.     LEA    $DFF0D0,A5
  505.     LEA    mt_chan4temp(PC),A6
  506.     BSR.S    mt_PlayVoice
  507.     BRA    mt_SetDMA
  508.  
  509. mt_PlayVoice
  510.     TST.L    (A6)
  511.     BNE.S    mt_plvskip
  512.     BSR    mt_PerNop
  513. mt_plvskip
  514.     MOVE.L    (A0,D1.L),(A6)
  515.     ADDQ.L    #4,D1
  516.     MOVEQ    #0,D2
  517.     MOVE.B    n_cmd(A6),D2
  518.     AND.B    #$F0,D2
  519.     LSR.B    #4,D2
  520.     MOVE.B    (A6),D0
  521.     AND.B    #$F0,D0
  522.     OR.B    D0,D2
  523.     TST.B    D2
  524.     BEQ    mt_SetRegs
  525.  
  526.     move.w    d2,n_sample(a6)
  527.  
  528.     MOVEQ    #0,D3
  529.     LEA    mt_SampleStarts(PC),A1
  530.     MOVE    D2,D4
  531.     SUBQ.L    #1,D2
  532.     ASL.L    #2,D2
  533.     MULU    #30,D4
  534.     MOVE.L    (A1,D2.L),n_start(A6)
  535.     MOVE.W    (A3,D4.L),n_length(A6)
  536.     MOVE.W    (A3,D4.L),n_reallength(A6)
  537.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  538.     MOVE.B    3(A3,D4.L),n_volume(A6)
  539.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  540.     TST.W    D3
  541.     BEQ.S    mt_NoLoop
  542.     MOVE.L    n_start(A6),D2    ; Get start
  543.     ASL.W    #1,D3
  544.     ADD.L    D3,D2        ; Add repeat
  545.     MOVE.L    D2,n_loopstart(A6)
  546.     MOVE.L    D2,n_wavestart(A6)
  547.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  548.     ADD.W    6(A3,D4.L),D0    ; Add replen
  549.     MOVE.W    D0,n_length(A6)
  550.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  551.     MOVEQ    #0,D0
  552.     MOVE.B    n_volume(A6),D0
  553. ;    MOVE.W    D0,8(A5)    ; Set volume
  554.     bsr    ahi_volume
  555.     BRA.S    mt_SetRegs
  556.  
  557. mt_NoLoop
  558.     MOVE.L    n_start(A6),D2
  559.     ADD.L    D3,D2
  560.     MOVE.L    D2,n_loopstart(A6)
  561.     MOVE.L    D2,n_wavestart(A6)
  562.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  563.     MOVEQ    #0,D0
  564.     MOVE.B    n_volume(A6),D0
  565. ;    MOVE.W    D0,8(A5)    ; Set volume
  566.     bsr    ahi_volume
  567. mt_SetRegs
  568.     MOVE.W    (A6),D0
  569.     AND.W    #$0FFF,D0
  570.     BEQ    mt_CheckMoreEfx    ; If no note
  571.     MOVE.W    2(A6),D0
  572.     AND.W    #$0FF0,D0
  573.     CMP.W    #$0E50,D0
  574.     BEQ.S    mt_DoSetFineTune
  575.     MOVE.B    2(A6),D0
  576.     AND.B    #$0F,D0
  577.     CMP.B    #3,D0    ; TonePortamento
  578.     BEQ.S    mt_ChkTonePorta
  579.     CMP.B    #5,D0
  580.     BEQ.S    mt_ChkTonePorta
  581.     CMP.B    #9,D0    ; Sample Offset
  582.     BNE.S    mt_SetPeriod
  583.     BSR    mt_CheckMoreEfx
  584.     BRA.S    mt_SetPeriod
  585.  
  586. mt_DoSetFineTune
  587.     BSR    mt_SetFineTune
  588.     BRA.S    mt_SetPeriod
  589.  
  590. mt_ChkTonePorta
  591.     BSR    mt_SetTonePorta
  592.     BRA    mt_CheckMoreEfx
  593.  
  594. mt_SetPeriod
  595.     MOVEM.L    D0-D1/A0-A1,-(SP)
  596.     MOVE.W    (A6),D1
  597.     AND.W    #$0FFF,D1
  598.     LEA    mt_PeriodTable(PC),A1
  599.     MOVEQ    #0,D0
  600.     MOVEQ    #36,D2
  601. mt_ftuloop
  602.     CMP.W    (A1,D0.W),D1
  603.     BHS.S    mt_ftufound
  604.     ADDQ.L    #2,D0
  605.     DBRA    D2,mt_ftuloop
  606. mt_ftufound
  607.     MOVEQ    #0,D1
  608.     MOVE.B    n_finetune(A6),D1
  609.     MULU    #36*2,D1
  610.     ADD.L    D1,A1
  611.     MOVE.W    (A1,D0.W),n_period(A6)
  612.     MOVEM.L    (SP)+,D0-D1/A0-A1
  613.  
  614.     MOVE.W    2(A6),D0
  615.     AND.W    #$0FF0,D0
  616.     CMP.W    #$0ED0,D0 ; Notedelay
  617.     BEQ    mt_CheckMoreEfx
  618.  
  619. ;    MOVE.W    n_dmabit(A6),$DFF096
  620.     BTST    #2,n_wavecontrol(A6)
  621.     BNE.S    mt_vibnoc
  622.     CLR.B    n_vibratopos(A6)
  623. mt_vibnoc
  624.     BTST    #6,n_wavecontrol(A6)
  625.     BNE.S    mt_trenoc
  626.     CLR.B    n_tremolopos(A6)
  627. mt_trenoc
  628. ;    MOVE.L    n_start(A6),(A5)    ; Set start
  629. ;    MOVE.W    n_length(A6),4(A5)    ; Set length
  630.  
  631.     MOVE.W    n_period(A6),D0
  632. ;    MOVE.W    D0,6(A5)        ; Set period
  633.     bsr    ahi_period
  634.     MOVE.W    n_dmabit(A6),D0
  635.     OR.W    D0,mt_DMACONtemp
  636. ;    BRA    mt_CheckMoreEfx
  637.     bsr    mt_CheckMoreEfx
  638.     move.w    n_sample(a6),d0        ;start sample after volume and period
  639.     bsr    ahi_sample        ;has been set.
  640.     rts
  641.  
  642. mt_SetDMA
  643. ;    MOVE.W    #DMAWait,D0
  644. ;mt_WaitDMA
  645. ;    DBRA    D0,mt_WaitDMA
  646. ;    MOVE.W    mt_DMACONtemp(PC),D0
  647. ;    OR.W    #$8000,D0
  648. ;    MOVE.W    D0,$DFF096
  649. ;    MOVE.W    #DMAWait,D0
  650. ;mt_WaitDMA2
  651. ;    DBRA    D0,mt_WaitDMA2
  652. ;
  653. ;    LEA    $DFF000,A5
  654. ;    LEA    mt_chan4temp(PC),A6
  655. ;    MOVE.L    n_loopstart(A6),$D0(A5)
  656. ;    MOVE.W    n_replen(A6),$D4(A5)
  657. ;    LEA    mt_chan3temp(PC),A6
  658. ;    MOVE.L    n_loopstart(A6),$C0(A5)
  659. ;    MOVE.W    n_replen(A6),$C4(A5)
  660. ;    LEA    mt_chan2temp(PC),A6
  661. ;    MOVE.L    n_loopstart(A6),$B0(A5)
  662. ;    MOVE.W    n_replen(A6),$B4(A5)
  663. ;    LEA    mt_chan1temp(PC),A6
  664. ;    MOVE.L    n_loopstart(A6),$A0(A5)
  665. ;    MOVE.W    n_replen(A6),$A4(A5)
  666.  
  667. mt_dskip
  668.     ADD.W    #16,mt_PatternPos
  669.     MOVE.B    mt_PattDelTime,D0
  670.     BEQ.S    mt_dskc
  671.     MOVE.B    D0,mt_PattDelTime2
  672.     CLR.B    mt_PattDelTime
  673. mt_dskc    TST.B    mt_PattDelTime2
  674.     BEQ.S    mt_dska
  675.     SUBQ.B    #1,mt_PattDelTime2
  676.     BEQ.S    mt_dska
  677.     SUB.W    #16,mt_PatternPos
  678. mt_dska    TST.B    mt_PBreakFlag
  679.     BEQ.S    mt_nnpysk
  680.     SF    mt_PBreakFlag
  681.     MOVEQ    #0,D0
  682.     MOVE.B    mt_PBreakPos(PC),D0
  683.     CLR.B    mt_PBreakPos
  684.     LSL.W    #4,D0
  685.     MOVE.W    D0,mt_PatternPos
  686. mt_nnpysk
  687.     CMP.W    #1024,mt_PatternPos
  688.     BLO.S    mt_NoNewPosYet
  689. mt_NextPosition    
  690.     MOVEQ    #0,D0
  691.     MOVE.B    mt_PBreakPos(PC),D0
  692.     LSL.W    #4,D0
  693.     MOVE.W    D0,mt_PatternPos
  694.     CLR.B    mt_PBreakPos
  695.     CLR.B    mt_PosJumpFlag
  696.     ADDQ.B    #1,mt_SongPos
  697.     AND.B    #$7F,mt_SongPos
  698.     MOVE.B    mt_SongPos(PC),D1
  699.     MOVE.L    mt_SongDataPtr(PC),A0
  700.     CMP.B    950(A0),D1
  701.     BLO.S    mt_NoNewPosYet
  702.     CLR.B    mt_SongPos
  703. mt_NoNewPosYet    
  704.     TST.B    mt_PosJumpFlag
  705.     BNE.S    mt_NextPosition
  706. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  707.     RTS
  708.  
  709. mt_CheckEfx
  710.     BSR    mt_UpdateFunk
  711.     MOVE.W    n_cmd(A6),D0
  712.     AND.W    #$0FFF,D0
  713.     BEQ.S    mt_PerNop
  714.     MOVE.B    n_cmd(A6),D0
  715.     AND.B    #$0F,D0
  716.     BEQ.S    mt_Arpeggio
  717.     CMP.B    #1,D0
  718.     BEQ    mt_PortaUp
  719.     CMP.B    #2,D0
  720.     BEQ    mt_PortaDown
  721.     CMP.B    #3,D0
  722.     BEQ    mt_TonePortamento
  723.     CMP.B    #4,D0
  724.     BEQ    mt_Vibrato
  725.     CMP.B    #5,D0
  726.     BEQ    mt_TonePlusVolSlide
  727.     CMP.B    #6,D0
  728.     BEQ    mt_VibratoPlusVolSlide
  729.     CMP.B    #$E,D0
  730.     BEQ    mt_E_Commands
  731. SetBack    ;MOVE.W    n_period(A6),6(A5)
  732.     move.l    d0,-(sp)
  733.     move.w    n_period(A6),d0
  734.     bsr    ahi_period
  735.     move.l    (sp)+,d0
  736.     CMP.B    #7,D0
  737.     BEQ    mt_Tremolo
  738.     CMP.B    #$A,D0
  739.     BEQ    mt_VolumeSlide
  740. mt_Return
  741.     RTS
  742.  
  743. mt_PerNop
  744. ;    MOVE.W    n_period(A6),6(A5)
  745.     move.w    n_period(A6),d0
  746.     bsr    ahi_period
  747.     RTS
  748.  
  749. mt_Arpeggio
  750.     MOVEQ    #0,D0
  751.     MOVE.B    mt_counter(PC),D0
  752.     DIVS    #3,D0
  753.     SWAP    D0
  754.     CMP.W    #0,D0
  755.     BEQ.S    mt_Arpeggio2
  756.     CMP.W    #2,D0
  757.     BEQ.S    mt_Arpeggio1
  758.     MOVEQ    #0,D0
  759.     MOVE.B    n_cmdlo(A6),D0
  760.     LSR.B    #4,D0
  761.     BRA.S    mt_Arpeggio3
  762.  
  763. mt_Arpeggio1
  764.     MOVEQ    #0,D0
  765.     MOVE.B    n_cmdlo(A6),D0
  766.     AND.B    #15,D0
  767.     BRA.S    mt_Arpeggio3
  768.  
  769. mt_Arpeggio2
  770.     MOVE.W    n_period(A6),D2
  771.     BRA.S    mt_Arpeggio4
  772.  
  773. mt_Arpeggio3
  774.     ASL.W    #1,D0
  775.     MOVEQ    #0,D1
  776.     MOVE.B    n_finetune(A6),D1
  777.     MULU    #36*2,D1
  778.     LEA    mt_PeriodTable(PC),A0
  779.     ADD.L    D1,A0
  780.     MOVEQ    #0,D1
  781.     MOVE.W    n_period(A6),D1
  782.     MOVEQ    #36,D3
  783. mt_arploop
  784.     MOVE.W    (A0,D0.W),D2
  785.     CMP.W    (A0),D1
  786.     BHS.S    mt_Arpeggio4
  787.     ADDQ.L    #2,A0
  788.     DBRA    D3,mt_arploop
  789.     RTS
  790.  
  791. mt_Arpeggio4
  792. ;    MOVE.W    D2,6(A5)
  793.     move.w    d2,d0
  794.     bsr    ahi_period
  795.     RTS
  796.  
  797. mt_FinePortaUp
  798.     TST.B    mt_counter
  799.     BNE    mt_Return
  800.     MOVE.B    #$0F,mt_LowMask
  801. mt_PortaUp
  802.     MOVEQ    #0,D0
  803.     MOVE.B    n_cmdlo(A6),D0
  804.     AND.B    mt_LowMask(PC),D0
  805.     MOVE.B    #$FF,mt_LowMask
  806.     SUB.W    D0,n_period(A6)
  807.     MOVE.W    n_period(A6),D0
  808.     AND.W    #$0FFF,D0
  809.     CMP.W    #113,D0
  810.     BPL.S    mt_PortaUskip
  811.     AND.W    #$F000,n_period(A6)
  812.     OR.W    #113,n_period(A6)
  813. mt_PortaUskip
  814.     MOVE.W    n_period(A6),D0
  815.     AND.W    #$0FFF,D0
  816. ;    MOVE.W    D0,6(A5)
  817.     bsr    ahi_period
  818.     RTS    
  819.  
  820. mt_FinePortaDown
  821.     TST.B    mt_counter
  822.     BNE    mt_Return
  823.     MOVE.B    #$0F,mt_LowMask
  824. mt_PortaDown
  825.     CLR.W    D0
  826.     MOVE.B    n_cmdlo(A6),D0
  827.     AND.B    mt_LowMask(PC),D0
  828.     MOVE.B    #$FF,mt_LowMask
  829.     ADD.W    D0,n_period(A6)
  830.     MOVE.W    n_period(A6),D0
  831.     AND.W    #$0FFF,D0
  832.     CMP.W    #856,D0
  833.     BMI.S    mt_PortaDskip
  834.     AND.W    #$F000,n_period(A6)
  835.     OR.W    #856,n_period(A6)
  836. mt_PortaDskip
  837.     MOVE.W    n_period(A6),D0
  838.     AND.W    #$0FFF,D0
  839. ;    MOVE.W    D0,6(A5)
  840.     bsr    ahi_period
  841.     RTS
  842.  
  843. mt_SetTonePorta
  844.     MOVE.L    A0,-(SP)
  845.     MOVE.W    (A6),D2
  846.     AND.W    #$0FFF,D2
  847.     MOVEQ    #0,D0
  848.     MOVE.B    n_finetune(A6),D0
  849.     MULU    #36*2,D0 ;37?
  850.     LEA    mt_PeriodTable(PC),A0
  851.     ADD.L    D0,A0
  852.     MOVEQ    #0,D0
  853. mt_StpLoop
  854.     CMP.W    (A0,D0.W),D2
  855.     BHS.S    mt_StpFound
  856.     ADDQ.W    #2,D0
  857.     CMP.W    #36*2,D0 ;37?
  858.     BLO.S    mt_StpLoop
  859.     MOVEQ    #35*2,D0
  860. mt_StpFound
  861.     MOVE.B    n_finetune(A6),D2
  862.     AND.B    #8,D2
  863.     BEQ.S    mt_StpGoss
  864.     TST.W    D0
  865.     BEQ.S    mt_StpGoss
  866.     SUBQ.W    #2,D0
  867. mt_StpGoss
  868.     MOVE.W    (A0,D0.W),D2
  869.     MOVE.L    (SP)+,A0
  870.     MOVE.W    D2,n_wantedperiod(A6)
  871.     MOVE.W    n_period(A6),D0
  872.     CLR.B    n_toneportdirec(A6)
  873.     CMP.W    D0,D2
  874.     BEQ.S    mt_ClearTonePorta
  875.     BGE    mt_Return
  876.     MOVE.B    #1,n_toneportdirec(A6)
  877.     RTS
  878.  
  879. mt_ClearTonePorta
  880.     CLR.W    n_wantedperiod(A6)
  881.     RTS
  882.  
  883. mt_TonePortamento
  884.     MOVE.B    n_cmdlo(A6),D0
  885.     BEQ.S    mt_TonePortNoChange
  886.     MOVE.B    D0,n_toneportspeed(A6)
  887.     CLR.B    n_cmdlo(A6)
  888. mt_TonePortNoChange
  889.     TST.W    n_wantedperiod(A6)
  890.     BEQ    mt_Return
  891.     MOVEQ    #0,D0
  892.     MOVE.B    n_toneportspeed(A6),D0
  893.     TST.B    n_toneportdirec(A6)
  894.     BNE.S    mt_TonePortaUp
  895. mt_TonePortaDown
  896.     ADD.W    D0,n_period(A6)
  897.     MOVE.W    n_wantedperiod(A6),D0
  898.     CMP.W    n_period(A6),D0
  899.     BGT.S    mt_TonePortaSetPer
  900.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  901.     CLR.W    n_wantedperiod(A6)
  902.     BRA.S    mt_TonePortaSetPer
  903.  
  904. mt_TonePortaUp
  905.     SUB.W    D0,n_period(A6)
  906.     MOVE.W    n_wantedperiod(A6),D0
  907.     CMP.W    n_period(A6),D0
  908.     BLT.S    mt_TonePortaSetPer
  909.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  910.     CLR.W    n_wantedperiod(A6)
  911.  
  912. mt_TonePortaSetPer
  913.     MOVE.W    n_period(A6),D2
  914.     MOVE.B    n_glissfunk(A6),D0
  915.     AND.B    #$0F,D0
  916.     BEQ.S    mt_GlissSkip
  917.     MOVEQ    #0,D0
  918.     MOVE.B    n_finetune(A6),D0
  919.     MULU    #36*2,D0
  920.     LEA    mt_PeriodTable(PC),A0
  921.     ADD.L    D0,A0
  922.     MOVEQ    #0,D0
  923. mt_GlissLoop
  924.     CMP.W    (A0,D0.W),D2
  925.     BHS.S    mt_GlissFound
  926.     ADDQ.W    #2,D0
  927.     CMP.W    #36*2,D0
  928.     BLO.S    mt_GlissLoop
  929.     MOVEQ    #35*2,D0
  930. mt_GlissFound
  931.     MOVE.W    (A0,D0.W),D2
  932. mt_GlissSkip
  933. ;    MOVE.W    D2,6(A5) ; Set period
  934.     move.w    d2,d0
  935.     bsr    ahi_period
  936.     RTS
  937.  
  938. mt_Vibrato
  939.     MOVE.B    n_cmdlo(A6),D0
  940.     BEQ.S    mt_Vibrato2
  941.     MOVE.B    n_vibratocmd(A6),D2
  942.     AND.B    #$0F,D0
  943.     BEQ.S    mt_vibskip
  944.     AND.B    #$F0,D2
  945.     OR.B    D0,D2
  946. mt_vibskip
  947.     MOVE.B    n_cmdlo(A6),D0
  948.     AND.B    #$F0,D0
  949.     BEQ.S    mt_vibskip2
  950.     AND.B    #$0F,D2
  951.     OR.B    D0,D2
  952. mt_vibskip2
  953.     MOVE.B    D2,n_vibratocmd(A6)
  954. mt_Vibrato2
  955.     MOVE.B    n_vibratopos(A6),D0
  956.     LEA    mt_VibratoTable(PC),A4
  957.     LSR.W    #2,D0
  958.     AND.W    #$001F,D0
  959.     MOVEQ    #0,D2
  960.     MOVE.B    n_wavecontrol(A6),D2
  961.     AND.B    #$03,D2
  962.     BEQ.S    mt_vib_sine
  963.     LSL.B    #3,D0
  964.     CMP.B    #1,D2
  965.     BEQ.S    mt_vib_rampdown
  966.     MOVE.B    #255,D2
  967.     BRA.S    mt_vib_set
  968. mt_vib_rampdown
  969.     TST.B    n_vibratopos(A6)
  970.     BPL.S    mt_vib_rampdown2
  971.     MOVE.B    #255,D2
  972.     SUB.B    D0,D2
  973.     BRA.S    mt_vib_set
  974. mt_vib_rampdown2
  975.     MOVE.B    D0,D2
  976.     BRA.S    mt_vib_set
  977. mt_vib_sine
  978.     MOVE.B    (A4,D0.W),D2
  979. mt_vib_set
  980.     MOVE.B    n_vibratocmd(A6),D0
  981.     AND.W    #15,D0
  982.     MULU    D0,D2
  983.     LSR.W    #7,D2
  984.     MOVE.W    n_period(A6),D0
  985.     TST.B    n_vibratopos(A6)
  986.     BMI.S    mt_VibratoNeg
  987.     ADD.W    D2,D0
  988.     BRA.S    mt_Vibrato3
  989. mt_VibratoNeg
  990.     SUB.W    D2,D0
  991. mt_Vibrato3
  992. ;    MOVE.W    D0,6(A5)
  993.     bsr    ahi_period
  994.     MOVE.B    n_vibratocmd(A6),D0
  995.     LSR.W    #2,D0
  996.     AND.W    #$003C,D0
  997.     ADD.B    D0,n_vibratopos(A6)
  998.     RTS
  999.  
  1000. mt_TonePlusVolSlide
  1001.     BSR    mt_TonePortNoChange
  1002.     BRA    mt_VolumeSlide
  1003.  
  1004. mt_VibratoPlusVolSlide
  1005.     BSR.S    mt_Vibrato2
  1006.     BRA    mt_VolumeSlide
  1007.  
  1008. mt_Tremolo
  1009.     MOVE.B    n_cmdlo(A6),D0
  1010.     BEQ.S    mt_Tremolo2
  1011.     MOVE.B    n_tremolocmd(A6),D2
  1012.     AND.B    #$0F,D0
  1013.     BEQ.S    mt_treskip
  1014.     AND.B    #$F0,D2
  1015.     OR.B    D0,D2
  1016. mt_treskip
  1017.     MOVE.B    n_cmdlo(A6),D0
  1018.     AND.B    #$F0,D0
  1019.     BEQ.S    mt_treskip2
  1020.     AND.B    #$0F,D2
  1021.     OR.B    D0,D2
  1022. mt_treskip2
  1023.     MOVE.B    D2,n_tremolocmd(A6)
  1024. mt_Tremolo2
  1025.     MOVE.B    n_tremolopos(A6),D0
  1026.     LEA    mt_VibratoTable(PC),A4
  1027.     LSR.W    #2,D0
  1028.     AND.W    #$001F,D0
  1029.     MOVEQ    #0,D2
  1030.     MOVE.B    n_wavecontrol(A6),D2
  1031.     LSR.B    #4,D2
  1032.     AND.B    #$03,D2
  1033.     BEQ.S    mt_tre_sine
  1034.     LSL.B    #3,D0
  1035.     CMP.B    #1,D2
  1036.     BEQ.S    mt_tre_rampdown
  1037.     MOVE.B    #255,D2
  1038.     BRA.S    mt_tre_set
  1039. mt_tre_rampdown
  1040.     TST.B    n_vibratopos(A6)
  1041.     BPL.S    mt_tre_rampdown2
  1042.     MOVE.B    #255,D2
  1043.     SUB.B    D0,D2
  1044.     BRA.S    mt_tre_set
  1045. mt_tre_rampdown2
  1046.     MOVE.B    D0,D2
  1047.     BRA.S    mt_tre_set
  1048. mt_tre_sine
  1049.     MOVE.B    (A4,D0.W),D2
  1050. mt_tre_set
  1051.     MOVE.B    n_tremolocmd(A6),D0
  1052.     AND.W    #15,D0
  1053.     MULU    D0,D2
  1054.     LSR.W    #6,D2
  1055.     MOVEQ    #0,D0
  1056.     MOVE.B    n_volume(A6),D0
  1057.     TST.B    n_tremolopos(A6)
  1058.     BMI.S    mt_TremoloNeg
  1059.     ADD.W    D2,D0
  1060.     BRA.S    mt_Tremolo3
  1061. mt_TremoloNeg
  1062.     SUB.W    D2,D0
  1063. mt_Tremolo3
  1064.     BPL.S    mt_TremoloSkip
  1065.     CLR.W    D0
  1066. mt_TremoloSkip
  1067.     CMP.W    #$40,D0
  1068.     BLS.S    mt_TremoloOk
  1069.     MOVE.W    #$40,D0
  1070. mt_TremoloOk
  1071. ;    MOVE.W    D0,8(A5)
  1072.     bsr    ahi_volume
  1073.     MOVE.B    n_tremolocmd(A6),D0
  1074.     LSR.W    #2,D0
  1075.     AND.W    #$003C,D0
  1076.     ADD.B    D0,n_tremolopos(A6)
  1077.     RTS
  1078.  
  1079. mt_SampleOffset
  1080. ;    MOVEQ    #0,D0
  1081. ;    MOVE.B    n_cmdlo(A6),D0
  1082. ;    BEQ.S    mt_sononew
  1083. ;    MOVE.B    D0,n_sampleoffset(A6)
  1084. ;mt_sononew
  1085. ;    MOVE.B    n_sampleoffset(A6),D0
  1086. ;    LSL.W    #7,D0
  1087. ;    CMP.W    n_length(A6),D0
  1088. ;    BGE.S    mt_sofskip
  1089. ;    SUB.W    D0,n_length(A6)
  1090. ;    LSL.W    #1,D0
  1091. ;    ADD.L    D0,n_start(A6)
  1092.     RTS
  1093. ;mt_sofskip
  1094. ;    MOVE.W    #$0001,n_length(A6)
  1095. ;    RTS
  1096.  
  1097. mt_VolumeSlide
  1098.     MOVEQ    #0,D0
  1099.     MOVE.B    n_cmdlo(A6),D0
  1100.     LSR.B    #4,D0
  1101.     TST.B    D0
  1102.     BEQ.S    mt_VolSlideDown
  1103. mt_VolSlideUp
  1104.     ADD.B    D0,n_volume(A6)
  1105.     CMP.B    #$40,n_volume(A6)
  1106.     BMI.S    mt_vsuskip
  1107.     MOVE.B    #$40,n_volume(A6)
  1108. mt_vsuskip
  1109.     MOVE.B    n_volume(A6),D0
  1110. ;    MOVE.W    D0,8(A5)
  1111.     bsr    ahi_volume
  1112.     RTS
  1113.  
  1114. mt_VolSlideDown
  1115.     MOVEQ    #0,D0
  1116.     MOVE.B    n_cmdlo(A6),D0
  1117.     AND.B    #$0F,D0
  1118. mt_VolSlideDown2
  1119.     SUB.B    D0,n_volume(A6)
  1120.     BPL.S    mt_vsdskip
  1121.     CLR.B    n_volume(A6)
  1122. mt_vsdskip
  1123.     MOVE.B    n_volume(A6),D0
  1124. ;    MOVE.W    D0,8(A5)
  1125.     bsr    ahi_volume
  1126.     RTS
  1127.  
  1128. mt_PositionJump
  1129.     MOVE.B    n_cmdlo(A6),D0
  1130.     SUBQ.B    #1,D0
  1131.     MOVE.B    D0,mt_SongPos
  1132. mt_pj2    CLR.B    mt_PBreakPos
  1133.     ST     mt_PosJumpFlag
  1134.     RTS
  1135.  
  1136. mt_VolumeChange
  1137.     MOVEQ    #0,D0
  1138.     MOVE.B    n_cmdlo(A6),D0
  1139.     CMP.B    #$40,D0
  1140.     BLS.S    mt_VolumeOk
  1141.     MOVEQ    #$40,D0
  1142. mt_VolumeOk
  1143.     MOVE.B    D0,n_volume(A6)
  1144. ;    MOVE.W    D0,8(A5)
  1145.     bsr    ahi_volume
  1146.     RTS
  1147.  
  1148. mt_PatternBreak
  1149.     MOVEQ    #0,D0
  1150.     MOVE.B    n_cmdlo(A6),D0
  1151.     MOVE.L    D0,D2
  1152.     LSR.B    #4,D0
  1153.     MULU    #10,D0
  1154.     AND.B    #$0F,D2
  1155.     ADD.B    D2,D0
  1156.     CMP.B    #63,D0
  1157.     BHI.S    mt_pj2
  1158.     MOVE.B    D0,mt_PBreakPos
  1159.     ST    mt_PosJumpFlag
  1160.     RTS
  1161.  
  1162. mt_SetSpeed
  1163.     MOVEQ    #0,D0
  1164.     MOVE.B    3(A6),D0
  1165.     BEQ    mt_end
  1166.     CMP.B    #32,D0
  1167.     BHS    SetTempo
  1168.     CLR.B    mt_counter
  1169.     MOVE.B    D0,mt_speed
  1170.     RTS
  1171.  
  1172. mt_CheckMoreEfx
  1173.     BSR    mt_UpdateFunk
  1174.     MOVE.B    2(A6),D0
  1175.     AND.B    #$0F,D0
  1176.     CMP.B    #$9,D0
  1177.     BEQ    mt_SampleOffset
  1178.     CMP.B    #$B,D0
  1179.     BEQ    mt_PositionJump
  1180.     CMP.B    #$D,D0
  1181.     BEQ.S    mt_PatternBreak
  1182.     CMP.B    #$E,D0
  1183.     BEQ.S    mt_E_Commands
  1184.     CMP.B    #$F,D0
  1185.     BEQ.S    mt_SetSpeed
  1186.     CMP.B    #$C,D0
  1187.     BEQ    mt_VolumeChange
  1188.     BRA    mt_PerNop
  1189.  
  1190. mt_E_Commands
  1191.     MOVE.B    n_cmdlo(A6),D0
  1192.     AND.B    #$F0,D0
  1193.     LSR.B    #4,D0
  1194.     BEQ.S    mt_FilterOnOff
  1195.     CMP.B    #1,D0
  1196.     BEQ    mt_FinePortaUp
  1197.     CMP.B    #2,D0
  1198.     BEQ    mt_FinePortaDown
  1199.     CMP.B    #3,D0
  1200.     BEQ.S    mt_SetGlissControl
  1201.     CMP.B    #4,D0
  1202.     BEQ    mt_SetVibratoControl
  1203.     CMP.B    #5,D0
  1204.     BEQ    mt_SetFineTune
  1205.     CMP.B    #6,D0
  1206.     BEQ    mt_JumpLoop
  1207.     CMP.B    #7,D0
  1208.     BEQ    mt_SetTremoloControl
  1209.     CMP.B    #9,D0
  1210.     BEQ    mt_RetrigNote
  1211.     CMP.B    #$A,D0
  1212.     BEQ    mt_VolumeFineUp
  1213.     CMP.B    #$B,D0
  1214.     BEQ    mt_VolumeFineDown
  1215.     CMP.B    #$C,D0
  1216.     BEQ    mt_NoteCut
  1217.     CMP.B    #$D,D0
  1218.     BEQ    mt_NoteDelay
  1219.     CMP.B    #$E,D0
  1220.     BEQ    mt_PatternDelay
  1221.     CMP.B    #$F,D0
  1222.     BEQ    mt_FunkIt
  1223.     RTS
  1224.  
  1225. mt_FilterOnOff
  1226. ;    MOVE.B    n_cmdlo(A6),D0
  1227. ;    AND.B    #1,D0
  1228. ;    ASL.B    #1,D0
  1229. ;    AND.B    #$FD,$BFE001
  1230. ;    OR.B    D0,$BFE001
  1231.     RTS    
  1232.  
  1233. mt_SetGlissControl
  1234.     MOVE.B    n_cmdlo(A6),D0
  1235.     AND.B    #$0F,D0
  1236.     AND.B    #$F0,n_glissfunk(A6)
  1237.     OR.B    D0,n_glissfunk(A6)
  1238.     RTS
  1239.  
  1240. mt_SetVibratoControl
  1241.     MOVE.B    n_cmdlo(A6),D0
  1242.     AND.B    #$0F,D0
  1243.     AND.B    #$F0,n_wavecontrol(A6)
  1244.     OR.B    D0,n_wavecontrol(A6)
  1245.     RTS
  1246.  
  1247. mt_SetFineTune
  1248.     MOVE.B    n_cmdlo(A6),D0
  1249.     AND.B    #$0F,D0
  1250.     MOVE.B    D0,n_finetune(A6)
  1251.     RTS
  1252.  
  1253. mt_JumpLoop
  1254.     TST.B    mt_counter
  1255.     BNE    mt_Return
  1256.     MOVE.B    n_cmdlo(A6),D0
  1257.     AND.B    #$0F,D0
  1258.     BEQ.S    mt_SetLoop
  1259.     TST.B    n_loopcount(A6)
  1260.     BEQ.S    mt_jumpcnt
  1261.     SUBQ.B    #1,n_loopcount(A6)
  1262.     BEQ    mt_Return
  1263. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1264.     ST    mt_PBreakFlag
  1265.     RTS
  1266.  
  1267. mt_jumpcnt
  1268.     MOVE.B    D0,n_loopcount(A6)
  1269.     BRA.S    mt_jmploop
  1270.  
  1271. mt_SetLoop
  1272.     MOVE.W    mt_PatternPos(PC),D0
  1273.     LSR.W    #4,D0
  1274.     MOVE.B    D0,n_pattpos(A6)
  1275.     RTS
  1276.  
  1277. mt_SetTremoloControl
  1278.     MOVE.B    n_cmdlo(A6),D0
  1279.     AND.B    #$0F,D0
  1280.     LSL.B    #4,D0
  1281.     AND.B    #$0F,n_wavecontrol(A6)
  1282.     OR.B    D0,n_wavecontrol(A6)
  1283.     RTS
  1284.  
  1285. mt_RetrigNote
  1286.     MOVE.L    D1,-(SP)
  1287.     MOVEQ    #0,D0
  1288.     MOVE.B    n_cmdlo(A6),D0
  1289.     AND.B    #$0F,D0
  1290.     BEQ.S    mt_rtnend
  1291.     MOVEQ    #0,D1
  1292.     MOVE.B    mt_counter(PC),D1
  1293.     BNE.S    mt_rtnskp
  1294.     MOVE.W    (A6),D1
  1295.     AND.W    #$0FFF,D1
  1296.     BNE.S    mt_rtnend
  1297.     MOVEQ    #0,D1
  1298.     MOVE.B    mt_counter(PC),D1
  1299. mt_rtnskp
  1300.     DIVU    D0,D1
  1301.     SWAP    D1
  1302.     TST.W    D1
  1303.     BNE.S    mt_rtnend
  1304. mt_DoRetrig
  1305.     move.w    n_sample(a6),d0        ;last instrument
  1306.     bsr    ahi_sample
  1307.  
  1308. ;    MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1309. ;    MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1310. ;    MOVE.W    n_length(A6),4(A5)    ; Set length
  1311. ;    MOVE.W    #DMAWait,D0
  1312. ;mt_rtnloop1
  1313. ;    DBRA    D0,mt_rtnloop1
  1314. ;    MOVE.W    n_dmabit(A6),D0
  1315. ;    BSET    #15,D0
  1316. ;    MOVE.W    D0,$DFF096
  1317. ;    MOVE.W    #DMAWait,D0
  1318. ;mt_rtnloop2
  1319. ;    DBRA    D0,mt_rtnloop2
  1320. ;
  1321. ;    MOVE.L    n_loopstart(A6),(A5)
  1322. ;    MOVE.L    n_replen(A6),4(A5)
  1323. mt_rtnend
  1324.     MOVE.L    (SP)+,D1
  1325.     RTS
  1326.  
  1327. mt_VolumeFineUp
  1328.     TST.B    mt_counter
  1329.     BNE    mt_Return
  1330.     MOVEQ    #0,D0
  1331.     MOVE.B    n_cmdlo(A6),D0
  1332.     AND.B    #$F,D0
  1333.     BRA    mt_VolSlideUp
  1334.  
  1335. mt_VolumeFineDown
  1336.     TST.B    mt_counter
  1337.     BNE    mt_Return
  1338.     MOVEQ    #0,D0
  1339.     MOVE.B    n_cmdlo(A6),D0
  1340.     AND.B    #$0F,D0
  1341.     BRA    mt_VolSlideDown2
  1342.  
  1343. mt_NoteCut
  1344.     MOVEQ    #0,D0
  1345.     MOVE.B    n_cmdlo(A6),D0
  1346.     AND.B    #$0F,D0
  1347.     CMP.B    mt_counter(PC),D0
  1348.     BNE    mt_Return
  1349.     CLR.B    n_volume(A6)
  1350. ;    MOVE.W    #0,8(A5)
  1351.     moveq    #0,d0
  1352.     bsr    ahi_volume
  1353.     RTS
  1354.  
  1355. mt_NoteDelay
  1356.     MOVEQ    #0,D0
  1357.     MOVE.B    n_cmdlo(A6),D0
  1358.     AND.B    #$0F,D0
  1359.     CMP.B    mt_counter,D0
  1360.     BNE    mt_Return
  1361.     MOVE.W    (A6),D0
  1362.     BEQ    mt_Return
  1363.     MOVE.L    D1,-(SP)
  1364.     BRA    mt_DoRetrig
  1365.  
  1366. mt_PatternDelay
  1367.     TST.B    mt_counter
  1368.     BNE    mt_Return
  1369.     MOVEQ    #0,D0
  1370.     MOVE.B    n_cmdlo(A6),D0
  1371.     AND.B    #$0F,D0
  1372.     TST.B    mt_PattDelTime2
  1373.     BNE    mt_Return
  1374.     ADDQ.B    #1,D0
  1375.     MOVE.B    D0,mt_PattDelTime
  1376.     RTS
  1377.  
  1378. mt_FunkIt
  1379. ;    TST.B    mt_counter
  1380. ;    BNE    mt_Return
  1381. ;    MOVE.B    n_cmdlo(A6),D0
  1382. ;    AND.B    #$0F,D0
  1383. ;    LSL.B    #4,D0
  1384. ;    AND.B    #$0F,n_glissfunk(A6)
  1385. ;    OR.B    D0,n_glissfunk(A6)
  1386. ;    TST.B    D0
  1387. ;    BEQ    mt_Return
  1388. mt_UpdateFunk
  1389. ;    MOVEM.L    A0/D1,-(SP)
  1390. ;    MOVEQ    #0,D0
  1391. ;    MOVE.B    n_glissfunk(A6),D0
  1392. ;    LSR.B    #4,D0
  1393. ;    BEQ.S    mt_funkend
  1394. ;    LEA    mt_FunkTable(PC),A0
  1395. ;    MOVE.B    (A0,D0.W),D0
  1396. ;    ADD.B    D0,n_funkoffset(A6)
  1397. ;    BTST    #7,n_funkoffset(A6)
  1398. ;    BEQ.S    mt_funkend
  1399. ;    CLR.B    n_funkoffset(A6)
  1400. ;
  1401. ;    MOVE.L    n_loopstart(A6),D0
  1402. ;    MOVEQ    #0,D1
  1403. ;    MOVE.W    n_replen(A6),D1
  1404. ;    ADD.L    D1,D0
  1405. ;    ADD.L    D1,D0
  1406. ;    MOVE.L    n_wavestart(A6),A0
  1407. ;    ADDQ.L    #1,A0
  1408. ;    CMP.L    D0,A0
  1409. ;    BLO.S    mt_funkok
  1410. ;    MOVE.L    n_loopstart(A6),A0
  1411. ;mt_funkok
  1412. ;    MOVE.L    A0,n_wavestart(A6)
  1413. ;    MOVEQ    #-1,D0
  1414. ;    SUB.B    (A0),D0
  1415. ;    MOVE.B    D0,(A0)
  1416. ;mt_funkend
  1417. ;    MOVEM.L    (SP)+,A0/D1
  1418.     RTS
  1419.  
  1420.  
  1421. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1422.  
  1423. mt_VibratoTable    
  1424.     dc.b   0, 24, 49, 74, 97,120,141,161
  1425.     dc.b 180,197,212,224,235,244,250,253
  1426.     dc.b 255,253,250,244,235,224,212,197
  1427.     dc.b 180,161,141,120, 97, 74, 49, 24
  1428.  
  1429. mt_PeriodTable
  1430. ; Tuning 0, Normal
  1431.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1432.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1433.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1434. ; Tuning 1
  1435.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1436.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1437.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1438. ; Tuning 2
  1439.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1440.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1441.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1442. ; Tuning 3
  1443.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1444.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1445.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1446. ; Tuning 4
  1447.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1448.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1449.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1450. ; Tuning 5
  1451.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1452.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1453.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1454. ; Tuning 6
  1455.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1456.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1457.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1458. ; Tuning 7
  1459.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1460.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1461.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1462. ; Tuning -8
  1463.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1464.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1465.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1466. ; Tuning -7
  1467.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1468.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1469.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1470. ; Tuning -6
  1471.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1472.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1473.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1474. ; Tuning -5
  1475.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1476.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1477.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1478. ; Tuning -4
  1479.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1480.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1481.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1482. ; Tuning -3
  1483.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1484.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1485.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1486. ; Tuning -2
  1487.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1488.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1489.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1490. ; Tuning -1
  1491.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1492.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1493.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1494.  
  1495. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0 
  1496. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1497. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1498. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1499.  
  1500. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1501.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1502.  
  1503. mt_SongDataPtr    dc.l 0
  1504. mt_speed    dc.b 6
  1505. mt_counter    dc.b 0
  1506. mt_SongPos    dc.b 0
  1507. mt_PBreakPos    dc.b 0
  1508. mt_PosJumpFlag    dc.b 0
  1509. mt_PBreakFlag    dc.b 0
  1510. mt_LowMask    dc.b 0
  1511. mt_PattDelTime    dc.b 0
  1512. mt_PattDelTime2    dc.b 0
  1513. mt_Enable    dc.b 0
  1514. mt_PatternPos    dc.w 0
  1515. mt_DMACONtemp    dc.w 0
  1516.  
  1517. ;/* End of File */
  1518.  
  1519.  
  1520.     section    module,data    ;No chipmem needed!
  1521. mt_data:
  1522.     incbin "st-00:Modules/MOD/mod.avoidtune"
  1523. mt_data_len    EQU    *-mt_data
  1524.